#include "LogFileHandler.h"
#include <QFile>
#include <QTextStream>
#include <QDir>
#include <QFileInfo>
#include <QDateTime>

/**
 * @brief 构造函数，初始化最后清理时间戳并执行初始清理
 * @param parent 父对象指针（用于内存管理）
 */
LogFileHandler::LogFileHandler(QObject *parent) : QObject(parent) {
    m_lastCleanTime = QDateTime::currentDateTime(); // 初始化最后清理时间为当前时间
    // 初始化时就执行一次清理，即使目录还未设置
    cleanExpiredLogs();
}

/**
 * @brief 写入日志内容到文件，并触发定期清理逻辑
 * @param logContent 需要写入的日志文本（格式：[时间戳] 发送者: 消息内容）
 */
void LogFileHandler::writeLog(const QString& logContent) {
    if (m_logDir.isEmpty()) return; // 目录未设置时跳过

    // 创建目录（若不存在）
    QDir dir(m_logDir);
    if (!dir.exists()) {
        dir.mkpath("."); // 递归创建目录
    }

    // 生成带时间戳的日志文件名（格式：log_yyyyMMdd.txt）
    QString fileName = QString("log_%1.txt").arg(QDateTime::currentDateTime().toString("yyyyMMdd"));
    QFile file(dir.filePath(fileName));

    // 追加模式写入文件
    if (file.open(QIODevice::Append | QIODevice::Text)) {
        QTextStream stream(&file);
        stream << logContent << "\n";
        file.close();
    }
}

/**
 * @brief 清理超过保留期限的日志文件（默认保留7天）
 * @param daysToKeep 需要保留的最近天数（如7表示保留最近7天的日志）
 */
void LogFileHandler::setLogDir(const QString& dir) {
    m_logDir = dir;
    // 设置目录后执行一次清理
    cleanExpiredLogs();
}

void LogFileHandler::cleanExpiredLogs(int daysToKeep) {
    if (m_logDir.isEmpty()) return; // 目录未设置时跳过

    QDir dir(m_logDir);
    // 获取所有日志文件（匹配log_*.txt模式）
    QFileInfoList fileList = dir.entryInfoList(QStringList() << "log_*.txt", QDir::Files);
    QDateTime cutoff = QDateTime::currentDateTime().addDays(-daysToKeep); // 计算保留截止时间

    // 遍历文件列表删除过期文件
    foreach (const QFileInfo &fileInfo, fileList) {
        if (fileInfo.lastModified() < cutoff) { // 比较文件最后修改时间与截止时间
            QFile::remove(fileInfo.absoluteFilePath()); // 删除过期文件
        }
    }
}
